home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 4
/
Aminet 4 - November 1994.iso
/
aminet
/
dev
/
c
/
intuition++_1_0.lzh
/
ipp
/
examples
/
littlepainter.cc
< prev
next >
Wrap
C/C++ Source or Header
|
1993-04-05
|
6KB
|
247 lines
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
//
// Little test program implementing a simple painter to illustrate
// how objects are easy to use, and easy to handle.
//
// For all comment email 'brulhart@cuilima.unige.ch'
//
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
#include <stream.h>
#include <stdlib.h>
///////////////////////////////////////////////////////////////////////////////
// Intuition objects created with PowerWindows defined in 'drawctrl.c'
extern struct NewScreen NewScreenStructure;
extern struct TagItem ScreenTags[];
extern struct NewWindow CTRLNewWindowStructure1;
extern struct NewWindow BITNewWindowStructure2;
extern struct Gadget CTRLpoint;
extern struct Gadget CTRLfree;
extern struct Gadget CTRLline;
extern struct Gadget CTRLrect;
extern struct Gadget CTRLcircle;
extern struct Image CTRLImage1;
extern struct Image CTRLImage2;
extern struct Image CTRLImage3;
extern struct Image CTRLImage4;
extern struct Image CTRLImage5;
extern struct Image CTRLImage6;
extern struct Image CTRLImage7;
extern struct Image CTRLImage8;
extern struct Image CTRLImage9;
extern struct Image CTRLImage10;
extern struct Menu Menu1;
extern struct Menu Menu2;
extern struct MenuItem MenuItem1;
extern struct MenuItem MenuItem2;
extern struct MenuItem MenuItem3;
///////////////////////////////////////////////////////////////////////////////
// Global objects used by the painter
#define POINTS 1
#define FREEHANDS 2
#define LINES 3
#define RECTANGLES 4
#define ELLIPSES 5
#define DO(from,until,do,undo,result) from while (! (until)) { do undo } result
#include <ipp/mgwindow.h>
#include <ipp/wgscreen.h>
MsgWindow ctrlw(&CTRLNewWindowStructure1);
MGWindow bw(&BITNewWindowStructure2);
WGScreen scr(&NewScreenStructure, ScreenTags);
int drawingmode=POINTS;
///////////////////////////////////////////////////////////////////////////////
// Functions used by the painter
void help(IMessage& message)
{
scr.setapen(2);
scr.setfont((STRPTR)"Dom32.font",32,0,0);
for (int i=0; i<30; i+=5)
scr.drawrect(200-i,400-i,500+i,480+i);
scr.writetext(250,450,"Do you really need help ?");
scr.setfont((STRPTR)"FuturaB.font",12,0,0);
ctrlw.offgadget(&CTRLpoint);
}
void quit(IMessage& message) { bw.close(); ctrlw.close(); scr.close(); exit(0); }
void clear(IMessage& message) { bw.clear(); ctrlw.ongadget(&CTRLpoint);}
void point(IMessage& message) { drawingmode=POINTS; }
void free(IMessage& message) { drawingmode=FREEHANDS; }
void line(IMessage& message) { drawingmode=LINES; }
void rect(IMessage& message) { drawingmode=RECTANGLES; }
void circle(IMessage& message) { drawingmode=ELLIPSES; }
void makepoint(IMessage& message)
{
IMessage mess;
DO(
bw.setapen(1);
bw.setdrmd(JAM1);
bw.writepixel(message.imousex,message.imousey);
,
bw.getImsg(mess)->icode==SELECTUP
,
bw.writepixel(bw.mousex(),bw.mousey()); ,, );
}
void makefreehand(IMessage& message)
{
IMessage mess;
DO(
bw.setapen(1);
bw.setdrmd(JAM1);
bw.setpenpos(message.imousex,message.imousey);
,
bw.getImsg(mess)->icode==SELECTUP
,
bw.drawlineto(bw.mousex(),bw.mousey()); ,, );
}
void makeline(IMessage& message)
{
IMessage mess;
int x,y;
DO(
bw.setapen(1);
bw.setdrmd(COMPLEMENT);
,
bw.getImsg(mess)->icode==SELECTUP
,
x=bw.mousex();
y=bw.mousey();
bw.drawline(message.imousex,message.imousey,x,y);
,
bw.drawline(message.imousex,message.imousey,x,y);
,
bw.setdrmd(JAM1);
bw.drawline(message.imousex,message.imousey,x,y); );
}
void makeellipse(IMessage& message)
{
IMessage mess;
int x,y;
DO(
bw.setapen(1);
bw.setdrmd(COMPLEMENT);
,
bw.getImsg(mess)->icode==SELECTUP
,
x=abs(message.imousex-bw.mousex());
y=abs(message.imousey-bw.mousey());
bw.drawellipse(message.imousex,message.imousey,x,y);
,
bw.drawellipse(message.imousex,message.imousey,x,y);
,
bw.setdrmd(JAM1);
bw.drawellipse(message.imousex,message.imousey,x,y); );
}
void makerectangle(IMessage& message)
{
IMessage mess;
int x,y;
DO(
bw.setapen(1);
bw.setdrmd(COMPLEMENT);
,
bw.getImsg(mess)->icode==SELECTUP
,
x=(message.imousex-bw.mousex());
y=(message.imousey-bw.mousey());
bw.drawrect(message.imousex,message.imousey,message.imousex-x,message.imousey-y);
,
bw.drawrect(message.imousex,message.imousey,message.imousex-x,message.imousey-y);
,
bw.setdrmd(JAM1);
bw.drawrect(message.imousex,message.imousey,message.imousex-x,message.imousey-y); );
}
void mouseselectup(IMessage& message)
{
switch(drawingmode)
{
case POINTS:
makepoint(message);
break;
case FREEHANDS:
makefreehand(message);
break;
case LINES:
makeline(message);
break;
case RECTANGLES:
makerectangle(message);
break;
case ELLIPSES:
makeellipse(message);
break;
}
}
///////////////////////////////////////////////////////////////////////////////
// The application. Note that no initialization at all is needed to be made.
main()
{
// Set fonts to windows and screen
scr.setfont((STRPTR)"FuturaB.font",12,0,0);
bw.setfont((STRPTR)"Dom32.font",32,0,0);
// Link events for drawing window
bw.linkIevent(MOUSEBUTTONS,SELECTDOWN,0,NULL,mouseselectup);
bw.linkIevent(CLOSEWINDOW,0,0,NULL,quit);
bw.linkmenu(&Menu1);
bw.linkIevent(MENUPICK,0,0,(void *)&MenuItem1,clear);
bw.linkIevent(MENUPICK,0,0,(void *)&MenuItem2,help);
bw.linkIevent(MENUPICK,0,0,(void *)&MenuItem3,quit);
// Link events for control window
ctrlw.linkgadgets(&CTRLpoint);
ctrlw.linkmenu(&Menu1);
ctrlw.linkIevent(MENUPICK,0,0,(void *)&MenuItem1,clear);
ctrlw.linkIevent(MENUPICK,0,0,(void *)&MenuItem2,help);
ctrlw.linkIevent(MENUPICK,0,0,(void *)&MenuItem3,quit);
ctrlw.linkIevent(GADGETUP,0,0,(void *)&CTRLpoint,point);
ctrlw.linkIevent(GADGETUP,0,0,(void *)&CTRLfree,free);
ctrlw.linkIevent(GADGETUP,0,0,(void *)&CTRLline,line);
ctrlw.linkIevent(GADGETUP,0,0,(void *)&CTRLrect,rect);
ctrlw.linkIevent(GADGETUP,0,0,(void *)&CTRLcircle,circle);
ctrlw.linkIevent(CLOSEWINDOW,0,0,NULL,quit);
// Link windows to the screen
scr.linkwindow(ctrlw);
scr.linkwindow(bw);
// Open all and give control to the waitgraphicscreen
scr.open();
bw.open();
ctrlw.open();
bw.writetext(50,50,"Welcome");
scr.hardcontrol();
// Just for fun
ctrlw.close();
bw.close();
}